﻿/*
MiniAccess支持的实体属性的映射方式有如下几种：
<entity name="" table="" command-type="" insert="" 
              delete="" multiple-delete="" update="" multiple-update="" fetch="" search="" >
	<primary-key name="" column="" column-type="" update="true|flase" insert="true|false"/>
	<property name=""    column="" column-type="" update="true|flase" insert="true|false"/>
	<many-to-one name="" column="" column-type="" update="true|flase" insert="true|false"/>
	<one-to-one name="" column="" column-type="" update="true|flase" insert="true|false"/>
</entity>
下面是根据数据生成的基本映射框架，可以复制到程序集下“程序集名字.mdm.xml”中修改使用，比如修改程序集和连接字符串的设置等。
<?xml version="1.0" encoding="utf-8" ?>
<miniaccess-mapping xmlns="urn:miniacess-mapping-1.0" >
	<access-type name="System.Data.SqlClient">
		<provider name="DemoDatabase" entity-namespace="Demo.EntityAccess" is-debug="true">
			<entity name="CatelogEntity" table="Catelog" > 
			</entity>
			<entity name="ProductEntity" table="Product" > 
			</entity>
		</provider>
	</access-type>
</miniaccess-mapping>
*/
//-----------------------------------------------------------------
// 该代码文件由CodeSmith的MiniAccess.cst模板创建，运行时需要MiniAccess程序集的支持。 
// 创建者  :  Coolman
// 创建时间:  2011年6月4日
//-----------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Configuration;

/// <summary>
/// 包含存取DemoDatabase数据库的Access工具类和所有Entity实体类。
/// <br/>这些类均实现为Partial方式，使用时可以在单独的文件中扩展这些类的成员。
/// </summary>
namespace Demo.EntityAccess
{
    using Ruandao.MiniAccess;
	using Ruandao.MiniAccess.SqlServer;

    /// <summary>
	/// 该类封装了SqlServerAccessProvider的IAccess接口实现，提供了存取DemoDatabase数据库的工具方法。
    /// <br/>该类使用了单例模式，没有公开构造方法，只能通过GetInstance()获取类的实例。
    /// </summary>
	public partial class DemoDatabaseAccess : AccessBase
	{
        static  Dictionary<string, DemoDatabaseAccess > instances = new Dictionary<string,DemoDatabaseAccess >();
		
        /// <summary>
        /// 获取DemoDatabaseAccess的实例。
        /// </summary>
        /// <returns>DemoDatabaseAccess的实例。</returns>
        public static DemoDatabaseAccess GetInstance()
        {
            if ( !instances.ContainsKey("DemoDatabase") )
            {
                string accessType = DataSourceSetter.Instance.GetAccessType("DemoDatabase");
                string connString = DataSourceSetter.Instance.GetConnectionString("DemoDatabase");
				
				IAccess accessProvider;
				switch (accessType)
				{
					case "System.Data.SqlClient":
						accessProvider = new SqlServerAccess(
							Assembly.GetAssembly(typeof(DemoDatabaseAccess)), "DemoDatabase", connString);
						break;
					default:
						accessProvider = new SqlServerAccess(
							Assembly.GetAssembly(typeof(DemoDatabaseAccess)), "DemoDatabase", connString);
						break;
				}
                instances.Add("DemoDatabase", new DemoDatabaseAccess(accessProvider) );
            }
            return instances["DemoDatabase"];
        }

        private DemoDatabaseAccess(IAccess accessProvider)
            : base(accessProvider)
        {
			// 此处无需代码。
        }
	}

	/// <summary>
	/// Table [Catelog] MiniAccess Entity Class 
	/// </summary>
	public partial class CatelogEntity : EntityBase< CatelogEntity >
	{
		#region Construct

		public CatelogEntity():base(DemoDatabaseAccess.GetInstance())
        {
            // 此处无需代码。
        }
		
		#endregion
		
		#region Get and Set Properties for All Columns.

		private int catelogId = 0;
		public int CatelogId
		{
			get { return this.catelogId; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.catelogId != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("catelogId", this.catelogId);
                    this.catelogId = value;
                }
			}
		}

		private string title = String.Empty;
		public string Title
		{
			get { return this.title; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.title != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("title", this.title);
                    this.title = value;
                }
			}
		}
		
		#endregion

		#region 获取主键所对应外键表的实体集合。
		// 函数名以Get打头，后面接着是外键表的名称，最后是Entities后缀。

		public IList< ProductEntity > GetProductEntities()
		{
			return DemoDatabaseAccess.GetInstance().SearchEntities< ProductEntity >("WHERE CatelogId="+catelogId);
		}
		
		#endregion
		
		#region 获取外键所对应的实体。
		// 函数名以Get打头，后面部分是外键的名称，如果外键的名称以"FK_<表名>_"开始，则只取后半部分的名称。
		
		
		#endregion

		#region static Method
		
		// 根据主键查找和删除实体的函数。
		
		public static CatelogEntity Fetch(int catelogId)
		{
            return DemoDatabaseAccess.GetInstance().FetechEntity< CatelogEntity >(catelogId);
		}
		public static int Delete(int catelogId)
		{
            return DemoDatabaseAccess.GetInstance().DeleteEntity< CatelogEntity >(catelogId);
		}
		
		
        // 获取表中的所有记录。
		public static IList< CatelogEntity > GetAllEntities()
		{
            return DemoDatabaseAccess.GetInstance().SearchEntities< CatelogEntity >("");
		} 
		#endregion
		
	}

	/// <summary>
	/// Table [Product] MiniAccess Entity Class 
	/// </summary>
	public partial class ProductEntity : EntityBase< ProductEntity >
	{
		#region Construct

		public ProductEntity():base(DemoDatabaseAccess.GetInstance())
        {
            // 此处无需代码。
        }
		
		#endregion
		
		#region Get and Set Properties for All Columns.

		private int productId = 0;
		public int ProductId
		{
			get { return this.productId; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.productId != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("productId", this.productId);
                    this.productId = value;
                }
			}
		}

		private int catelogId = 0;
		public int CatelogId
		{
			get { return this.catelogId; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.catelogId != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("catelogId", this.catelogId);
                    this.catelogId = value;
                }
			}
		}

		private string title = String.Empty;
		public string Title
		{
			get { return this.title; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.title != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("title", this.title);
                    this.title = value;
                }
			}
		}

		private decimal price = 0.0M;
		public decimal Price
		{
			get { return this.price; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.price != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("price", this.price);
                    this.price = value;
                }
			}
		}

		private string description = String.Empty;
		public string Description
		{
			get { return this.description; }
			set
			{
                if (this.IsDelete) throw new OrMapException("不能修改已经标识为删除的实体的属性。");
                if (this.description != value)
                {
                    if ( !this.IsNew ) ChangePropertyValue("description", this.description);
                    this.description = value;
                }
			}
		}
		
		#endregion

		#region 获取主键所对应外键表的实体集合。
		// 函数名以Get打头，后面接着是外键表的名称，最后是Entities后缀。

		
		#endregion
		
		#region 获取外键所对应的实体。
		// 函数名以Get打头，后面部分是外键的名称，如果外键的名称以"FK_<表名>_"开始，则只取后半部分的名称。
		
		public CatelogEntity GetCatelog()
		{
			return DemoDatabaseAccess.GetInstance().FetechEntity< CatelogEntity >(catelogId);
		}
		
		#endregion

		#region static Method
		
		// 根据主键查找和删除实体的函数。
		
		public static ProductEntity Fetch(int productId)
		{
            return DemoDatabaseAccess.GetInstance().FetechEntity< ProductEntity >(productId);
		}
		public static int Delete(int productId)
		{
            return DemoDatabaseAccess.GetInstance().DeleteEntity< ProductEntity >(productId);
		}
		
		
        // 获取表中的所有记录。
		public static IList< ProductEntity > GetAllEntities()
		{
            return DemoDatabaseAccess.GetInstance().SearchEntities< ProductEntity >("");
		} 
		#endregion
		
	}
}
